package jp.ac.u_tokyo.dch.util.common;

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import jp.ac.u_tokyo.dch.core.db.CustomPreparedStatement;
import jp.ac.u_tokyo.dch.core.db.CustomResultSet;
import jp.ac.u_tokyo.dch.core.db.DBConnection;
import jp.ac.u_tokyo.dch.core.exceptions.DBException;
import jp.ac.u_tokyo.dch.util.DchLogger;

/**
 * @version 1.1
 */
public class CommonDBConnection {
	/**
	 * ログ
	 */
	private static DchLogger logger =  DchLogger.getLogger(CommonDBConnection.class);

	/**
	 * DBコネクションオブジェクトを取得する
	 * @return  DBコネクションオブジェクト
	 * @throws DBException 例外
	 */
	public static DBConnection getDbconnection() throws DBException {
		DBConnection dbConn = null;
		try {
			Context initCtx = new InitialContext();
			Context envCtx = (Context) initCtx.lookup("java:comp/env");
			DataSource ds = (DataSource) envCtx.lookup("jdbc/outputdb");
			Connection conn = ds.getConnection();
			dbConn = new DBConnection(conn);
		} catch (NamingException e1) {
			logger.error(e1);
			throw new DBException(e1);
		} catch (SQLException e) {
			logger.error(e);
			throw new DBException(e);
		}

		return dbConn;
	}

	/**
	 * DBコネクションをクローズする
	 * @param con DBコネクションオブジェクト
	 * @throws DBException 例外
	 */
	public static void closeConnection(DBConnection con) throws DBException {
		if (con != null) {
			try {
				con.close();
			}
			catch (DBException ex) {
				logger.error(ex);
				throw ex;
			}

		}
	}

	/**
	 * DB関連リソースをクローズする
	 * @param ps PreparedStatement
	 * @param rs CustomResultSet
	 * @throws DBException 例外
	 */
	public static void closeResource(CustomPreparedStatement ps, CustomResultSet rs) throws DBException {

		closeResource(ps);

		if (rs != null) {
			try {
				rs.close();
			}
			catch (DBException ex) {
				logger.error(ex);
				throw ex;
			}

		}

	}
	/**
	 * DB関連リソースをクローズする
	 * @param ps PreparedStatement
	 * @throws DBException 例外
	 */
	public static void closeResource(CustomPreparedStatement ps) throws DBException {
		if (ps != null) {
			try {
				ps.close();
			}
			catch (DBException ex) {
				logger.error(ex);
				throw ex;
			}

		}
	}
}
